/*
**      $Filename: net/if.h $
**      $Release$
**      $Revision: 3.1 $
**      $Date: 1994/02/03 11:56:05 $
**
**      Network interface
**
**      Copyright © 1993,1994 AmiTCP/IP Group, <AmiTCP-Group@hut.fi>
**                  Helsinki University of Technology, Finland.
**                  All rights reserved.
*/

/*
 * Copyright (c) 1982, 1986, 1989 Regents of the University of California.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *      This product includes software developed by the University of
 *      California, Berkeley and its contributors.
 * 4. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 *      @(#)if.h        7.11 (Berkeley) 3/19/91
 */

/*
 * Structures defining a network interface, providing a packet
 * transport mechanism (ala level 0 of the PUP protocols).
 *
 * Each interface accepts output datagrams of a specified maximum
 * length, and provides higher level routines with input datagrams
 * received from its medium.
 *
 * Output occurs when the routine if_output is called, with three parameters:
 *      (*ifp->if_output)(ifp, m, dst)
 * Here m is the mbuf chain to be sent and dst is the destination address.
 * The output routine encapsulates the supplied datagram if necessary,
 * and then transmits it on its medium.
 *
 * On input, each interface unwraps the data received by it, and either
 * places it on the input queue of a internetwork datagram routine
 * and posts the associated software interrupt, or passes the datagram to a raw
 * packet input routine.
 *
 * Routines exist for locating interfaces by their addresses
 * or for locating a interface on a certain network, as well as more general
 * routing and gateway routines maintaining information used to locate
 * interfaces.  These routines live in the files if.c and route.c
 */

//MODULE 'sys/time'


/*
 * Structure defining a queue for a network interface.
 *
 * (Would like to call this struct ``if'', but C isn't PL/1.)
 */

OBJECT ifqueue
    ifq_head:PTR TO mbuf,
    ifq_tail:PTR TO mbuf,
    ifq_len:LONG,
    ifq_maxlen:LONG,
    ifq_drops:LONG


OBJECT ifnet
    if_name:PTR TO BYTE,               /* name, e.g. ``en'' or ``lo'' */
    if_unit:WORD,                /* sub-unit for lower level driver */
    if_mtu:WORD,                 /* maximum transmission unit */
    if_flags:WORD,               /* up/down, broadcast, etc. */
    if_timer:WORD,               /* time 'til if_watchdog called */
    if_metric:LONG,              /* routing metric (external only) */
    if_addrlist:PTR TO ifaddr,    /* linked list of addresses per if */
    if_snd:PTR TO ifqueue,         /* output queue */
/* procedure handles */
    if_init:LONG,           /* init routine */
    if_output:LONG,    /* output routine (enqueue) */
    if_start:LONG,          /* initiate output routine */
    if_done:LONG,           /* output complete routine */
    if_ioctl:LONG, /* ioctl routine */
    if_reset:LONG,          /* bus reset routine */
    if_watchdog:LONG,       /* timer routine */
/* generic interface statistics */
    if_ipackets:LONG,            /* packets received on interface */
    if_ierrors:LONG,             /* input errors on interface */
    if_opackets:LONG,            /* packets sent on interface */
    if_oerrors:LONG,             /* output errors on interface */
    if_collisions:LONG,          /* collisions on csma interfaces */
/* end statistics */
    if_next:PTR TO ifnet,
    if_type:UBYTE,                /* ethernet, tokenring, etc */
    if_addrlen:UBYTE,             /* media address length */
    if_hdrlen:UBYTE,              /* media header length */
    if_index:UBYTE,               /* numeric abbreviation for this if  */
/* more statistics here to avoid recompiling netstat */
    if_lastchange:TimeVal,  /* last updated */
    if_ibytes:LONG,              /* total number of octets received */
    if_obytes:LONG,              /* total number of octets sent */
    if_imcasts:LONG,             /* packets received via multicast */
    if_omcasts:LONG,             /* packets sent via multicast */
    if_iqdrops:LONG,             /* dropped on input, this interface */
    if_noproto:LONG,             /* destined for unsupported protocol */
    if_baudrate:LONG,            /* linespeed */
    if_pcount:LONG              /* number of promiscuous listeners */


/*
 * Output queues (ifp->if_snd) and internetwork datagram level (pup level 1)
 * input routines have queues of messages stored on ifqueue structures
 * (defined above).  Entries are added to and deleted from these structures
 * by these macros, which should be called with ipl raised to splimp().
 */
#define IF_QFULL(ifq)           ((ifq).ifq_len >= (ifq).ifq_maxlen)
#define IF_DROP(ifq)            ((ifq).ifq_drops++)

/* --- must convert ---
#define IF_ENQUEUE(ifq, m) { \
        (m)->m_nextpkt = 0; \
        if ((ifq)->ifq_tail == 0) \
                (ifq)->ifq_head = m; \
        else \
                (ifq)->ifq_tail->m_nextpkt = m; \
        (ifq)->ifq_tail = m; \
        (ifq)->ifq_len++; \
}
#define IF_PREPEND(ifq, m) { \
        (m)->m_nextpkt = (ifq)->ifq_head; \
        if ((ifq)->ifq_tail == 0) \
                (ifq)->ifq_tail = (m); \
        (ifq)->ifq_head = (m); \
        (ifq)->ifq_len++; \
}
#define IF_DEQUEUE(ifq, m) { \
        (m) = (ifq)->ifq_head; \
        if (m) { \
                if (((ifq)->ifq_head = (m)->m_nextpkt) == 0) \
                        (ifq)->ifq_tail = 0; \
                (m)->m_nextpkt = 0; \
                (ifq)->ifq_len--; \
        } \
}
*/

#define IFQ_MAXLEN      50
#define IFNET_SLOWHZ    1               /* granularity is 1 second */

#endif /* KERNEL */

#define IFF_UP          $1             /* interface is up */
#define IFF_BROADCAST   $2             /* broadcast address valid */
#define IFF_DEBUG       $4             /* turn on debugging */
#define IFF_LOOPBACK    $8             /* is a loopback net */
#define IFF_POINTOPOINT $10            /* interface is point-to-point link */
#define IFF_NOTRAILERS  $20            /* avoid use of trailers */
#define IFF_RUNNING     $40            /* resources allocated */
#define IFF_NOARP       $80            /* no address resolution protocol */
#define IFF_SIMPLEX     $800           /* can't hear own transmissions */

/* next two not supported now, but reserved: */
#define IFF_PROMISC     $100           /* receive all packets */
#define IFF_ALLMULTI    $200           /* receive all multicast packets */
#define IFF_OACTIVE     $400           /* transmission in progress */

/* flags set internally only: */
#define IFF_CANTCHANGE \
        (IFF_BROADCAST|IFF_POINTOPOINT|IFF_RUNNING|IFF_OACTIVE|IFF_SIMPLEX)

/*
 * The ifaddr structure contains information about one address
 * of an interface.  They are maintained by the different address families,
 * are allocated and attached when an address is set, and are linked
 * together so all addresses for an interface can be located.
 */
OBJECT ifaddr
    ifa_addr:PTR TO sockaddr,     /* address of interface */
    ifa_dstaddr:PTR TO sockaddr,  /* other end of p-to-p link */
    ifa_netmask:PTR TO sockaddr,  /* used to determine subnet */
    ifa_ifp:PTR TO ifnet,         /* back-pointer to interface */
    ifa_next:PTR TO ifaddr,       /* next address for interface */
    ifa_rtrequest:LONG,   /* check or clean routes (+ or -)'d */
    ifa_rt:PTR TO rtentry,        /* ??? for ROUTETOIF */
    ifa_flags:UWORD,              /* mostly rt_flags for cloning */
    ifa_llinfolen:UWORD          /* extra to malloc for link info */


#define IFA_ROUTE       RTF_UP          /* route installed */


/*
 * Interface request structure used for socket
 * ioctl's.  All interface ioctl's must have parameter
 * definitions which begin with ifr_name.  The
 * remainder may be interface specific.
 */
#define IFNAMSIZ        16

OBJECT  ifreq
    ifr_name[16]:BYTE,             /* if name, e.g. "en0" */
    [CUNION
        ifru_addr:sockaddr,
        ifru_dstaddr:sockaddr,
        ifru_broadaddr:sockaddr,
        ifru_flags:WORD,
        ifru_metric:LONG,
        ifru_data:PTR TO BYTE
    ENDUNION]:ifr_ifru

#define ifr_addr        ifr_ifru.ifru_addr      /* address */
#define ifr_dstaddr     ifr_ifru.ifru_dstaddr   /* other end of p-to-p link */
#define ifr_broadaddr   ifr_ifru.ifru_broadaddr /* broadcast address */
#define ifr_flags       ifr_ifru.ifru_flags     /* flags */
#define ifr_metric      ifr_ifru.ifru_metric    /* metric */
#define ifr_data        ifr_ifru.ifru_data      /* for use by interface */

OBJECT ifaliasreq
    ifra_name[16]:BYTE,            /* if name, e.g. "en0" */
    ifra_addr:sockaddr,
    ifra_broadaddr:sockaddr,
    ifra_mask:sockaddr


/*
 * Structure used in SIOCGIFCONF request.
 * Used to retrieve interface configuration
 * for machine (useful for programs which
 * must know all networks accessible).
 */
OBJECT ifconf
    ifc_len:LONG,                /* size of associated buffer */
    [CUNION
        ifcu_buf:PTR TO BYTE,
        ifcu_req:PTR TO ifreq
    ENDUNION]:ifc_ifcu

#define ifc_buf ifc_ifcu.ifcu_buf       /* buffer address */
#define ifc_req ifc_ifcu.ifcu_req       /* array of structures returned */



